package com.dhcc.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dhcc.base.BaseServiceImpl;
import com.dhcc.entity.SysApiPerm;
import com.dhcc.httpApiService.IdGeneratorService;
import com.dhcc.mapper.SysApiPermMapper;
import com.dhcc.service.SysApiPermService;
import com.dhcc.service.SysUserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 接口权限表接口实现类
 *
 * @ProjectName Dhcc-Cloud
 * @PackageName com.dhcc.service.impl
 * @Title SysApiPermServiceImpl
 * @Date 2024/12/5 下午10:18
 * @Author LiuGuoting
 */
@Service
public class SysApiPermServiceImpl extends BaseServiceImpl<SysApiPermMapper, SysApiPerm> implements SysApiPermService {
    /**
     * 注入ID生成器服务
     */
    @Resource
    private IdGeneratorService idGeneratorService;
    /**
     * 注入用户服务对象
     */
    @Resource
    private SysUserService sysUserService;

    /**
     * 自定义分页查询接口权限信息
     *
     * @param page       分页参数
     * @param sysApiPerm 查询条件
     * @return IPage<SysApiPerm> 分页查询结果
     */
    @Override
    public IPage<SysApiPerm> page(IPage<SysApiPerm> page, SysApiPerm sysApiPerm) {
        // 创建查询条件
        LambdaQueryWrapper<SysApiPerm> sysApiPermLambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 条件查询
        sysApiPermLambdaQueryWrapper
                // 接口名称模糊查询
                .like(StringUtils.hasText(sysApiPerm.getScopeName()), SysApiPerm::getScopeName, sysApiPerm.getScopeName())
                // 查询未删除的接口权限信息（0-存在，1-删除）
                .eq(sysApiPerm.getDelFlag() != null, SysApiPerm::getDelFlag, 0)
                // 排序
                .orderByDesc(SysApiPerm::getSort);
        // 查询接口权限信息并遍历并设置创建者名称和更新者名称
        baseMapper.selectPage(page, sysApiPermLambdaQueryWrapper).getRecords().forEach(sysApiPerm1 -> {
            // 设置创建者名称
            sysApiPerm1.setCreateUser(sysUserService.getUserNameById(sysApiPerm1.getCreateUser()));
            // 设置更新者名称
            sysApiPerm1.setUpdateUser(sysUserService.getUserNameById(sysApiPerm1.getUpdateUser()));
        });
        return page;
    }

    /**
     * 查询所有接口权限信息
     *
     * @return List<SysApiPerm> 接口权限列表
     */
    @Override
    public List<SysApiPerm> listAll() {
        // 创建查询条件
        LambdaQueryWrapper<SysApiPerm> sysApiPermLambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 查询未删除的接口权限信息
        sysApiPermLambdaQueryWrapper.eq(SysApiPerm::getDelFlag, 0);
        // 排序
        sysApiPermLambdaQueryWrapper.orderByDesc(SysApiPerm::getSort);
        // 查询接口权限信息
        List<SysApiPerm> list = list(sysApiPermLambdaQueryWrapper);
        // 遍历并设置创建者名称和更新者名称
        list.forEach(sysApiPerm -> {
            sysApiPerm.setCreateUser(sysUserService.getUserNameById(sysApiPerm.getCreateUser()));
            sysApiPerm.setUpdateUser(sysUserService.getUserNameById(sysApiPerm.getUpdateUser()));
        });
        return list;
    }

    /**
     * 新增接口权限信息
     *
     * @param sysApiPerm 接口权限实体对象
     * @return Boolean 操作结果
     */
    @Override
    public Boolean addSysApiPerm(SysApiPerm sysApiPerm) {
        // 设置接口权限ID
        sysApiPerm.setId(idGeneratorService.nextId().toString());
        // 插入接口权限信息，新增成功返回true，否则返回false
        return baseMapper.insert(sysApiPerm) > 0;
    }

    /**
     * 更新接口权限信息
     *
     * @param sysApiPerm 接口权限实体对象
     * @return Boolean 操作结果
     */
    @Override
    public Boolean updateSysApiPerm(SysApiPerm sysApiPerm) {
        // 创建更新条件
        LambdaUpdateWrapper<SysApiPerm> sysApiPermLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        // 设置更新条件
        sysApiPermLambdaUpdateWrapper.eq(SysApiPerm::getId, sysApiPerm.getId());
        // 更新接口权限信息，更新成功返回true，否则返回false
        return baseMapper.update(sysApiPerm, sysApiPermLambdaUpdateWrapper) > 0;
    }

    /**
     * 查询接口权限信息
     *
     * @param id 接口权限ID
     * @return SysApiPerm 接口权限信息
     */
    @Override
    public SysApiPerm getSysApiPermById(String id) {
        // 创建查询条件
        LambdaQueryWrapper<SysApiPerm> sysApiPermLambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件
        sysApiPermLambdaQueryWrapper.eq(SysApiPerm::getId, id);
        // 查询接口权限信息
        SysApiPerm sysApiPerm = baseMapper.selectOne(sysApiPermLambdaQueryWrapper);
        // 接口权限信息不存在时返回null
        if (sysApiPerm == null) {
            // 接口权限不存在
            return null;
        }
        // 接口权限信息存在时，设置创建者名称和更新者名称
        sysApiPerm.setCreateUser(sysUserService.getUserNameById(sysApiPerm.getCreateUser()));
        sysApiPerm.setUpdateUser(sysUserService.getUserNameById(sysApiPerm.getUpdateUser()));
        return sysApiPerm;
    }

    /**
     * 更新接口权限状态
     *
     * @param id     接口权限ID
     * @param status 状态
     * @return Boolean 操作结果
     */
    @Override
    public Boolean updateStatus(String id, int status) {
        // 1. 构建更新条件
        LambdaUpdateWrapper<SysApiPerm> sysApiPermLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        // 2.设置更新条件,根据ID更新状态
        sysApiPermLambdaUpdateWrapper.eq(SysApiPerm::getId, id).set(SysApiPerm::getStatus, status);
        // 2. 更新接口权限状态，更新成功返回true，否则返回false
        return baseMapper.update(sysApiPermLambdaUpdateWrapper) > 0;
    }

    /**
     * 批量更新接口权限状态
     *
     * @param ids    接口权限ID集合
     * @param status 状态
     * @return Boolean 操作结果
     */
    @Override
    public Boolean updateStatusBatch(List<String> ids, int status) {
        // 1. 构建更新条件
        LambdaUpdateWrapper<SysApiPerm> sysApiPermLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        // 2.设置更新条件,根据ID集合批量更新状态
        sysApiPermLambdaUpdateWrapper.in(SysApiPerm::getId, ids).set(SysApiPerm::getStatus, status);
        // 2. 批量更新接口权限状态
        return baseMapper.update(sysApiPermLambdaUpdateWrapper) > 0;
    }
}
